/*=====================================================================================================================
 * 
 * Repository path:     $HeadURL: http://gpstrk.googlecode.com/svn/trunk/src/vtime.c $
 * Last committed:      $Revision: 50 $
 * Last changed by:     $Author: vladislav.gyurov@gmail.com $
 * Last changed date:   $Date: 2013-02-07 21:39:44 +0000 (Thu, 07 Feb 2013) $
 * ID:                  $Id: vtime.c 50 2013-02-07 21:39:44Z vladislav.gyurov@gmail.com $
 *
 *===================================================================================================================*/

/*=====================================================================================================================
 * Body Identification  
 *===================================================================================================================*/
#ifdef __VTIME_C
    #error "!!! FileName ID. It should be Unique !!!"
#else
    #define __VTIME_C
#endif

/*=====================================================================================================================
 * Included files to resolve specific definitions in this file
 *===================================================================================================================*/
#include "vtime.h"
#include "kernelinclude.h"
#include "aprs.h"

/*=====================================================================================================================
 * Local constants
 *===================================================================================================================*/
#define cTimeTickPeriodUs           40E3

/*=====================================================================================================================
 * Local macros
 *===================================================================================================================*/
#define mDD(s)	((U16)(((s)[0]-'0')*10)+((U16)((s)[1]-'0')))

/*=====================================================================================================================
 * Local types
 *===================================================================================================================*/

/*=====================================================================================================================
 * Local data
 *===================================================================================================================*/
static tOSAlarm TimeTickAlarm;
static tOSTimer TimeTimer;
static U16 u16SystemTimeSec;

/*=====================================================================================================================
 * Constant Local Data
 *===================================================================================================================*/

/*=====================================================================================================================
 * Constant exported data                                                     
 *===================================================================================================================*/

/*=====================================================================================================================
 * Exported Data
 *===================================================================================================================*/

/*=====================================================================================================================
 * Local Functions Prototypes
 *===================================================================================================================*/


/*=====================================================================================================================
 *
 *                                  E X P O R T E D    F U N C T I O N S
 *
 *===================================================================================================================*/
/*=====================================================================================================================
 * Parameters: void
 *
 * Return: void
 *
 * Description: 
 *===================================================================================================================*/
void VTime_Init(void)
{
    TimeTickAlarm.TaskID = cSysTimeTaskId;
    OsSetAlarm(&TimeTickAlarm, (cTimeTickPeriodUs/cOsAlarmTickUs));

    u16SystemTimeSec = 0;
    OSStartTimer(&TimeTimer);
}

/*=====================================================================================================================
 * Parameters: void
 *
 * Return: void
 *
 * Description: 
 *===================================================================================================================*/
void VTime_Task(void)
{
    if(cFalse != OSIsTimerElapsed(&TimeTimer, (1000UL/(cOsTimerTickUs/1000UL))-1UL))
    {
        ++u16SystemTimeSec;
        OSStartTimer(&TimeTimer);
    }
}

/*=====================================================================================================================
 * Parameters: void
 *
 * Return: void
 *
 * Description: 
 *===================================================================================================================*/
U16 VTime_GetSystemTick(void)
{
    return u16SystemTimeSec;
}

/*=====================================================================================================================
 * Parameters: void
 *
 * Return: void
 *
 * Description: 
 *===================================================================================================================*/
void VTime_GpsSet_ddmmyy(U8 *pu8ddmmyy, tNMEA_GPS_Data *GpsData)
{
    U8 *pu8ddmmyyL = pu8ddmmyy;

    GpsData->DateTime.tm_mday = mDD(pu8ddmmyyL);
    GpsData->DateTime.tm_mon  = mDD(pu8ddmmyyL+2U);
    
    // 241012 - date 24.10.2012
    if(GpsData->DateTime.tm_year == 0)
    {
        GpsData->DateTime.tm_year = ((2000U + mDD(pu8ddmmyyL+4U)));
    }
    
}

/*=====================================================================================================================
 * Parameters: void
 *
 * Return: void
 *
 * Description: 
 *===================================================================================================================*/
void VTime_GpsSet_hhmmss(U8 *pu8hhmmss, tNMEA_GPS_Data *GpsData)
{
    U8 *pu8hhmmssL = pu8hhmmss;
    U16 u16OldHour = GpsData->DateTime.tm_hour;

    GpsData->DateTime.tm_hour = mDD(pu8hhmmssL);
    if(GpsData->DateTime.tm_hour < u16OldHour)
    {
        GpsData->DateTime.tm_mday++;    // midnight wrap
    }
    GpsData->DateTime.tm_min = mDD(pu8hhmmssL+2U);
    GpsData->DateTime.tm_sec = mDD(pu8hhmmssL+4U);
}

/*=====================================================================================================================
 *                                                                            
 *                                     L O C A L    F U N C T I O N S                   
 *                                                                            
 *===================================================================================================================*/
/*=====================================================================================================================
 * Parameters: void
 *
 * Return: void
 *
 * Description: 
 *===================================================================================================================*/

